import { Injectable, NestInterceptor, ExecutionContext, CallHandler, Inject } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { JwtService } from '@nestjs/jwt';
import { Response } from 'express';

@Injectable()
export class JwtRefreshInterceptor implements NestInterceptor {
  constructor(@Inject(JwtService) private readonly jwtService: JwtService) {}

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(
      map(data => {
        const response = context.switchToHttp().getResponse<Response>();
        const request = context.switchToHttp().getRequest();
        
        // 检查是否有用户信息和JWT令牌
        if (request.user && request.headers.authorization) {
          try {
            const token = request.headers.authorization.replace('Bearer ', '');
            const payload = this.jwtService.decode(token) as any;
            
            // 检查令牌是否接近过期（剩余时间少于10分钟）
            if (payload && payload.exp) {
              const currentTime = Math.floor(Date.now() / 1000);
              const timeUntilExpiry = payload.exp - currentTime;
              // 如果剩余时间少于10分钟（600秒），则生成新令牌
              if (timeUntilExpiry < 600) {
                // 创建新的payload（更新iat和exp），以实现滑动过期机制
                // 在生成新令牌前移除 payload 中的 exp 字段
                const { exp, ...newPayload } = {
                  ...payload,
                  iat: currentTime,
                };
                
                // 签名新令牌，不传递signOptions以避免与payload中的exp冲突
                const newToken = this.jwtService.sign(newPayload);
                
                // 通过自定义头部返回新令牌
                response.setHeader('X-New-Token', newToken);
              }
            }
          } catch (error) {
            // 解码失败时不执行任何操作
            console.log('Error decoding token:', error);
          }
        }
        
        return data;
      }),
    );
  }
}